home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 010 / games.arc / CALENDAR.BAS (.txt) < prev    next >
Encoding:
GW-BASIC  |  1980-01-01  |  6.5 KB  |  305 lines

  1. 10  ' **********************
  2. 20  ' **     CALENDAR     **
  3. 30  ' **********************
  4. 40  '
  5. 50  CLEAR
  6. 60  SCREEN 0,0,0,0
  7. 70  CLS
  8. 80  KEY OFF
  9. 90  OPTION BASE 1
  10. 100  DIM MONTH.NAME$(12),WEEK.DAY$(7)
  11. 110  FOR I = 1 TO 12
  12. 120  READ MONTH.NAME$(I)
  13. 130  NEXT I
  14. 140  DATA JANUARY,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY
  15. 150  DATA AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER
  16. 160  FOR I = 1 TO 7
  17. 170  READ WEEK.DAY$(I)
  18. 180  NEXT I
  19. 190  DATA SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY
  20. 200  LOCATE 1,29
  21. 210  PRINT "* * *  CALENDAR  * * *
  22. 220  LOCATE 7,1
  23. 230  PRINT TAB(20)"F1.   Sketch a one month calendar page
  24. 240  PRINT
  25. 250  PRINT TAB(20)"F2.   Describe a given date
  26. 260  PRINT
  27. 270  PRINT TAB(20)"F3.   Number of days between two dates
  28. 280  PRINT
  29. 290  PRINT TAB(20)"F4.   Quit
  30. 300  LOCATE 25,25
  31. 310  PRINT "PRESS A SPECIAL FUNCTION KEY";
  32. 320  ON KEY(1) GOSUB 470
  33. 330  ON KEY(2) GOSUB 1220
  34. 340  ON KEY(3) GOSUB 1650
  35. 350  ON KEY(4) GOSUB 2010
  36. 360  KEY(1) ON
  37. 370  KEY(2) ON
  38. 380  KEY(3) ON
  39. 390  KEY(4) ON
  40. 400  '
  41. 410  WHILE QUIT = NOT.YET
  42. 420  KEY.BUFFER.CLEAR$ = INKEY$
  43. 430  WEND
  44. 440  CLS
  45. 450  END
  46. 460  '
  47. 470  ' F1 Subroutine, sketch a month
  48. 480  SCREEN 0,0,1,1
  49. 490  CLS
  50. 500  LOCATE 7,20
  51. 510  INPUT "What month ";Q$
  52. 520  IF Q$ = "" THEN 1190
  53. 530  GOSUB 2150
  54. 540  GOSUB 2220
  55. 550  MONTH = VAL(Q$)
  56. 560  IF MONTH THEN 600
  57. 570  FOR I = 1 TO 12
  58. 580  IF LEFT$(MONTH.NAME$(I),3) = LEFT$(Q$,3) THEN MONTH = I
  59. 590  NEXT I
  60. 600  IF MONTH THEN 650
  61. 610  LOCATE 8,12
  62. 620  PRINT "I don't recognize the month you entered ... try again
  63. 630  BEEP
  64. 640  GOTO 500
  65. 650  LOCATE 8,12
  66. 660  PRINT SPACE$(53);
  67. 670  LOCATE 9,20
  68. 680  INPUT "What year ";Q$
  69. 690  IF Q$ = "" THEN 1190
  70. 700  YEAR = VAL(Q$)
  71. 710  IF YEAR THEN 760
  72. 720  LOCATE 10,12
  73. 730  PRINT "I don't recognize the year you entered ... try again
  74. 740  BEEP
  75. 750  GOTO 670
  76. 760  IF YEAR < 100 THEN YEAR = YEAR + 1900
  77. 770  IF YEAR > 1581 AND YEAR < 4000 THEN 810
  78. 780  PRINT "The year must be in the range 1582 to 3999 ... try again
  79. 790  BEEP
  80. 800  GOTO 670
  81. 810  DAY = 1
  82. 820  GOSUB 2300
  83. 830  DAYOFWEEK = WEEKDAY
  84. 840  TITLE$ = MONTH.NAME$(MONTH)
  85. 850  JFIRST = JULIAN
  86. 860  MONTH = MONTH + 1
  87. 870  IF MONTH > 12 THEN MONTH = 1
  88. 880  IF MONTH = 1 THEN YEAR = YEAR + 1
  89. 890  GOSUB 2300
  90. 900  MONTHDAYS = JULIAN - JFIRST
  91. 910  CLS
  92. 920  LOCATE 1,37 - LEN(TITLE$) / 2
  93. 930  PRINT TITLE$ ; YEAR + (MONTH = 1)
  94. 940  DATE = 1
  95. 950  ROW = 6
  96. 960  COL = DAYOFWEEK * 7 + 10
  97. 970  LOCATE ROW,COL - (DATE < 10)
  98. 980  PRINT DATE
  99. 990  DATE = DATE + 1
  100. 1000  IF DATE > MONTHDAYS THEN 1040
  101. 1010  DAYOFWEEK = DAYOFWEEK MOD 7 + 1
  102. 1020  IF DAYOFWEEK = 1 THEN ROW = ROW + 3
  103. 1030  GOTO 960
  104. 1040  FOR ROWLINE = 4 TO ROW + 3 STEP 3
  105. 1050  LOCATE ROWLINE,15
  106. 1060  PRINT STRING$(50,"_");
  107. 1070  NEXT ROWLINE
  108. 1080  FOR ROW2 = 4 TO ROW + 1
  109. 1090  FOR COL2 = 15 TO 65 STEP 7
  110. 1100  LOCATE ROW2,COL2
  111. 1110  IF ROW2 = 4 THEN PRINT " "; ELSE PRINT "|";
  112. 1120  NEXT COL2,ROW2
  113. 1130  FOR I = 1 TO 7
  114. 1140  LOCATE 3,7 * I + 10
  115. 1150  PRINT LEFT$(WEEK.DAY$(I),3);
  116. 1160  NEXT I
  117. 1170  BARMESS = 1
  118. 1180  GOSUB 2070
  119. 1190  SCREEN 0,0,0,0
  120. 1200  RETURN
  121. 1210  '
  122. 1220  ' F2 Subroutine, describe a date
  123. 1230  SCREEN 0,0,1,1
  124. 1240  CLS
  125. 1250  LOCATE 7,7
  126. 1260  LINE INPUT "Enter a date ... (any reasonable format) ";CAL$
  127. 1270  IF CAL$ = "" THEN 1620
  128. 1280  GOSUB 2600
  129. 1290  IF YEAR THEN 1340
  130. 1300  PRINT
  131. 1310  PRINT "Your date is unrecognizable, or isn't a valid date ... try again.
  132. 1320  BEEP
  133. 1330  GOTO 1250
  134. 1340  CLS
  135. 1350  LOCATE 5,6
  136. 1360  BS$ = CHR$(29)
  137. 1370  PRINT MONTH;"/";DAY;"/";YEAR;"can also be written as ";
  138. 1380  PRINT MONTH.NAME$(MONTH);DAY;BS$;",";YEAR;BS$;"."
  139. 1390  LOCATE 7,7
  140. 1400  PRINT "The day of the week is ";WEEK.DAY$(WEEKDAY);"."
  141. 1410  IF YEAR < 1600 THEN 1590
  142. 1420  JULIAN2 = JULIAN
  143. 1430  MONTH2 = MONTH
  144. 1440  DAY2 = DAY
  145. 1450  YEAR2 = YEAR
  146. 1460  MONTH = 12
  147. 1470  DAY = 31
  148. 1480  YEAR = YEAR - 1
  149. 1490  IF YEAR < 1582 THEN 1540
  150. 1500  GOSUB 2300
  151. 1510  YEARDAY = JULIAN2 - JULIAN
  152. 1520  LOCATE 9,7
  153. 1530  PRINT "It is day number"YEARDAY"of"YEAR2;BS$;"."
  154. 1540  YEAR = (INT(YEAR/100) - 1) * 100 + 99
  155. 1550  GOSUB 2300
  156. 1560  CENTDAY = JULIAN2 - JULIAN
  157. 1570  LOCATE 11,7
  158. 1580  PRINT "It is the"CENTDAY"day of the century.
  159. 1590  LOCATE 13,7
  160. 1600  PRINT "And the astronomical julian day number is";JULIAN2;BS$;"."
  161. 1610  GOSUB 2070
  162. 1620  SCREEN 0,0,0,0
  163. 1630  RETURN
  164. 1640  '
  165. 1650  ' F3 Subroutine, days between dates
  166. 1660  SCREEN 0,0,1,1
  167. 1670  CLS
  168. 1680  LOCATE 7,7
  169. 1690  LINE INPUT "Enter one date ... (any reasonable format) ";CAL$
  170. 1700  IF CAL$ = "" THEN 1980
  171. 1710  GOSUB 2600
  172. 1720  IF YEAR THEN 1770
  173. 1730  LOCATE 9,1
  174. 1740  PRINT "Your date is unrecognizable, or isn't a valid date ... try again.
  175. 1750  BEEP
  176. 1760  GOTO 1680
  177. 1770  MONTH3 = MONTH
  178. 1780  DAY3 = DAY
  179. 1790  YEAR3 = YEAR
  180. 1800  JULIAN3 = JULIAN
  181. 1810  LOCATE 9,1
  182. 1820  PRINT SPACE$(79);
  183. 1830  LOCATE 9,7
  184. 1840  LINE INPUT "Enter second date ... ";CAL$
  185. 1850  IF CAL$ = "" THEN 1980
  186. 1860  GOSUB 2600
  187. 1870  IF YEAR THEN 1920
  188. 1880  LOCATE 11,1
  189. 1890  PRINT "Your date is unrecognizable, or isn't a valid date ... try again.
  190. 1900  BEEP
  191. 1910  GOTO 1830
  192. 1920  NUMDAYS = ABS(JULIAN3 - JULIAN)
  193. 1930  CLS
  194. 1940  LOCATE 7,7
  195. 1950  PRINT "Between";MONTH3;"/";DAY3;"/";YEAR3;"and";
  196. 1960  PRINT MONTH;"/";DAY;"/";YEAR;"there are";NUMDAYS;"days."
  197. 1970  GOSUB 2070
  198. 1980  SCREEN 0,0,0,0
  199. 1990  RETURN
  200. 2000  '
  201. 2010  ' F4 Subroutine, set quit flag
  202. 2020  QUIT = 1
  203. 2030  RETURN
  204. 2040  '
  205. 2050  '
  206. 2060  ' Subroutine, wait for user before proceeding
  207. 2070  LOCATE 25,28
  208. 2080  IF BARMESS = 0 THEN PRINT "PRESS ANY KEY TO PROCEED";
  209. 2090  K$ = INKEY$
  210. 2100  IF K$ = "" THEN 2090
  211. 2110  BARMESS = 0
  212. 2120  RETURN
  213. 2130  '
  214. 2140  ' Subroutine, de-space Q$
  215. 2150  SP = INSTR(Q$," ")
  216. 2160  IF SP = 0 THEN 2220
  217. 2170  Q$ = LEFT$(Q$,SP-1) + MID$(Q$,SP+1)
  218. 2180  GOTO 2150
  219. 2190  RETURN
  220. 2200  '
  221. 2210  ' Subroutine, just capitalize Q$
  222. 2220  FOR QP = 1 TO LEN(Q$)
  223. 2230  CHAR$ = MID$(Q$,QP,1)
  224. 2240  IF CHAR$ < "a" OR CHAR$ > "z" THEN 2260
  225. 2250  MID$(Q$,QP,1) = CHR$(ASC(CHAR$)-32)
  226. 2260  NEXT QP
  227. 2270  RETURN
  228. 2280  '
  229. 2290  ' Subroutine, MONTH,DAY,YEAR to JULIAN,WEEKDAY
  230. 2300  JULIAN = INT(365.242 * YEAR + 30.44 * (MONTH-1) + DAY + 1)
  231. 2310  T1 = MONTH - 2 - 12 * (MONTH < 3)
  232. 2320  T2 = YEAR + (MONTH < 3)
  233. 2330  T3 = INT(T2 / 100)
  234. 2340  T2 = T2 - 100 * T3
  235. 2350  WEEKDAY = INT(2.61 * T1 - 0.2) + DAY + T2 + INT(T2 / 4)
  236. 2360  WEEKDAY = (WEEKDAY + INT(T3 / 4) - T3 - T3 + 77) MOD 7 + 1
  237. 2370  T4 = JULIAN - 7 * INT(JULIAN / 7)
  238. 2380  JULIAN = JULIAN - T4 + WEEKDAY + 7 * (T4 < WEEKDAY - 1) + 1.72106E+06
  239. 2390  RETURN
  240. 2400  '
  241. 2410  ' Subroutine, JULIAN to MONTH,DAY,YEAR,WEEKDAY
  242. 2420  T5 = JULIAN
  243. 2430  YEAR = INT((JULIAN - 1.72106E+06) / 365.25 + 1)
  244. 2440  MONTH = 1
  245. 2450  DAY = 1
  246. 2460  GOSUB 2300
  247. 2470  IF JULIAN <= T5 THEN 2500
  248. 2480  YEAR = YEAR - 1
  249. 2490  GOTO 2460
  250. 2500  MONTH = INT((T5 - JULIAN) / 29 + 1)
  251. 2510  GOSUB 2300
  252. 2520  IF JULIAN <= T5 THEN 2550
  253. 2530  MONTH = MONTH - 1
  254. 2540  GOTO 2510
  255. 2550  DAY = T5 - JULIAN + 1
  256. 2560  GOSUB 2300
  257. 2570  RETURN
  258. 2580  '
  259. 2590  ' Subroutine, convert CAL$ to MONTH,DAY,YEAR
  260. 2600  Q$ = CAL$
  261. 2610  GOSUB 2220
  262. 2620  CAL$ = Q$
  263. 2630  MONTH = 0
  264. 2640  DAY = 0
  265. 2650  YEAR = 0
  266. 2660  FOR I = 1 TO 12
  267. 2670  IF INSTR(CAL$,LEFT$(MONTH.NAME$(I),3)) THEN MONTH = I
  268. 2680  NEXT I
  269. 2690  FOR I = 1 TO LEN(CAL$)
  270. 2700  CHAR$ = MID$(CAL$,I,1)
  271. 2710  IF CHAR$ < "0" OR CHAR$ > "9" THEN MID$(CAL$,I,1) = ":"
  272. 2720  NEXT I
  273. 2730  IF INSTR(CAL$,":") THEN 2790
  274. 2740  IF LEN(CAL$) <> 6 AND LEN(CAL$) <> 8 THEN 3040
  275. 2750  MONTH = VAL(LEFT$(CAL$,2))
  276. 2760  DAY = VAL(MID$(CAL$,3,2))
  277. 2770  YEAR = VAL(MID$(CAL$,5))
  278. 2780  GOTO 2930
  279. 2790  VFLAG = 0
  280. 2800  FOR I = 1 TO LEN(CAL$)
  281. 2810  CALVAL = VAL(MID$(CAL$,I))
  282. 2820  IF CALVAL = 0 THEN VFLAG = 0
  283. 2830  IF CALVAL = 0 OR VFLAG = 1 THEN 2920
  284. 2840  IF MONTH THEN 2870
  285. 2850  MONTH = CALVAL
  286. 2860  GOTO 2910
  287. 2870  IF DAY THEN 2900
  288. 2880  DAY = CALVAL
  289. 2890  GOTO 2910
  290. 2900  YEAR = CALVAL
  291. 2910  VFLAG = 1
  292. 2920  NEXT I
  293. 2930  IF YEAR < 100 AND YEAR > 0 THEN YEAR = YEAR + 1900
  294. 2940  IF YEAR < 1582 OR YEAR > 3999 THEN YEAR = 0
  295. 2950  IF YEAR = 0 THEN 3040
  296. 2960  MONTH2 = MONTH
  297. 2970  DAY2 = DAY
  298. 2980  YEAR2 = YEAR
  299. 2990  GOSUB 2300
  300. 3000  GOSUB 2420
  301. 3010  IF MONTH2 <> MONTH THEN YEAR = 0
  302. 3020  IF DAY2 <> DAY THEN YEAR = 0
  303. 3030  IF YEAR2 <> YEAR THEN YEAR = 0
  304. 3040  RETURN
  305.